#include "lrcpage.h"
#include "ui_lrcpage.h"
#include <QPropertyAnimation>
#include <QFile>
#include <QDebug>

LrcPage::LrcPage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LrcPage)
{
    ui->setupUi(this);
    // 设置窗体无边框
    this->setWindowFlag(Qt::FramelessWindowHint);

    animation = new QPropertyAnimation(this, "geometry");
    animation->setDuration(250);
    animation->setStartValue(QRect(10,10,this->width(), this->height()));
    animation->setEndValue(QRect(10,10 + this->height(),this->width(), this->height()));
    // 当动画结束的时候，再 hide 起来
    connect(animation, &QPropertyAnimation::finished, this, [=](){
        this->hide();
    });
}

LrcPage::~LrcPage()
{
    delete ui;
}

void LrcPage::on_hideButton_clicked()
{
    // 点击了按钮之后先启动动画
    animation->start();
}

bool LrcPage::parseLrcFile(const QString &lrcPath)
{
    QFile file(lrcPath);
    if(!file.open(QIODevice::ReadOnly))
    {
        // 文件打开失败
        qDebug() << "歌曲lrc文件：" << lrcPath << " 打开失败！";
        return false;
    }
    // 将上一首歌曲的 lrc 歌词清空
    lrcWordList.clear();

    // 打开了文件，按行读取
    while(!file.atEnd())  // 没有到结尾，表示还有歌词
    {
        QString line = file.readLine();  // 一行
        // [0:17.94]xxxxx
        // [0:17.600.00]xxxxx
        // ']' 前面就是播放的时间，后面就是歌词
        int pos = line.indexOf(']');
        QString time = line.mid(1, pos-1);
        QString text = line.mid(pos+1, line.size() - pos - 3);  // 去掉末尾的 \r\n
        int colon = time.indexOf(':');
        int firstPoint = time.indexOf('.', colon);
        int secondPoint = time.indexOf('.', firstPoint+1) == -1 ? time.size() : time.indexOf('.', firstPoint+1);

        qint64 totalTime = time.mid(0, colon).toLongLong() * 60 * 1000
                         + time.mid(colon+1, firstPoint-colon-1).toLongLong() * 1000
                         + time.mid(firstPoint+1, secondPoint-firstPoint-1).toLongLong();

        lrcWordList.push_back(lrcWordLine(totalTime, text));
    }
//    for(auto e : lrcWordList)
//    {
//        qDebug() << e._time << ' ' << e._lineText;
//    }

    return true;
}

void LrcPage::showLrcWordLine(qint64 time)
{
    // 根据当前的time计算当前应该显示哪一句歌词
    int index = getLrcWordLineIndex(time);
    // 显示 index前三句    index这一句    index后三句
    if(index != -1)
    {
        ui->lineCenter->setText(lrcWordList[index]._lineText);
        // 前三句
        ui->line1->setText(index-3 >= 0 ? lrcWordList[index-3]._lineText : "");
        ui->line2->setText(index-2 >= 0 ? lrcWordList[index-2]._lineText : "");
        ui->line3->setText(index-1 >= 0 ? lrcWordList[index-1]._lineText : "");
        // 后三句
        ui->line4->setText(index+1 < lrcWordList.size() ? lrcWordList[index+1]._lineText : "");
        ui->line5->setText(index+2 < lrcWordList.size() ? lrcWordList[index+2]._lineText : "");
        ui->line6->setText(index+3 < lrcWordList.size() ? lrcWordList[index+3]._lineText : "");
    }
    else
    {
        ui->line1->setText("");
        ui->line2->setText("");
        ui->line3->setText("");
        ui->line4->setText("");
        ui->line5->setText("");
        ui->line6->setText("");
        ui->lineCenter->setText("当前歌曲暂无歌词");
    }
}

int LrcPage::getLrcWordLineIndex(qint64 time)
{
    // 该歌曲不提供歌词
    if(lrcWordList.isEmpty()) return -1;
    // 如果当前时间比第一句歌词出现的时间还少，就一直显示第一句歌词
    if(time < lrcWordList[0]._time) return 0;
    // 遍历每一句歌词的时间
    for(int i = 1;i < lrcWordList.size();i++)
        if(time > lrcWordList[i-1]._time && time < lrcWordList[i]._time)
            // 当前一句话还没有播放结束，继续播放
            return i-1;
    // 如果没有合适的歌词了，还没结束歌曲，那么就一直显示最后一句歌词
    return lrcWordList.size() - 1;
}

void LrcPage::setMusicName(const QString &musicName)
{
    ui->musicName->setText(musicName);
}

void LrcPage::setMusicSinger(const QString &musicSinger)
{
    ui->musicSinger->setText(musicSinger);
}
